非オートスケール起動のEC2をELB(ALB)に自動アタッチさせてみた
はじめに
AWSチームのすずきです。
2つの異なるCloudFormationテンプレートで設置したELB(ALB)とEC2(Amazon Linux2)。 EC2インスタンスの起動時に実行されるUserDataを利用して、ELBへの自動アタッチを行う機会がありましたので、紹介させていただきます。
構成図
設定
UserData
#cloud-config packages: - jq - httpd runcmd: - export AWS_DEFAULT_REGION=ap-northeast-1 - STACK_NAME=sample-1 - INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id` - TARGET_GROUP_ARN=`aws cloudformation describe-stack-resource --stack-name $STACK_NAME --logical-resource-id AlbTargetGroup | jq -r .StackResourceDetail.PhysicalResourceId` # httpd setting - echo "<html><body>$INSTANCE_ID<br>`date`</body></html>" > /var/www/html/index.html - systemctl start httpd - systemctl enable httpd # elbv2 register-targets - aws elbv2 register-targets --target-group-arn $TARGET_GROUP_ARN --targets Id=$INSTANCE_ID,Port=80
packages
- Webサーバとなる「httpd」と、awscliの実行結果の加工のため「jq」をインストールします。
runcmd
- 環境変数
AWS_DEFAULT_REGION
は、CloudFormationの疑似パラメータで設定しました。 - インスタンスIDは、UserDataを実行するEC2のメタデータを利用します。
STACK_NAME
は、ELBを作成したCloudFormationの名称をパラメータから反映させました。- アタッチ先となるターゲットグループ情報(ARN)は、CloudFormationのリソース情報から awscli を利用して都度取得します。
- インストール直後のhttpd、ELBのヘルスチェックパスを成功させるために「index.html」を設置しています。
- CLIの引数
--target-group-arn
と--targets
に得られた値を反映し、ELBへのアタッチを実施します。
IAMロール
- 特定のCloudFormationスタックの参照権限と、指定ALBのアタッチ権限をEC2インスタンスに許可しました。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "cloudformation:Describe*" ], "Resource": [ "arn:aws:cloudformation:ap-northeast-1:000000000000:stack/sample-1*" ], "Effect": "Allow" }, { "Action": [ "elasticloadbalancing:Describe*", "elasticloadbalancing:RegisterTargets" ], "Resource": [ "arn:aws:elasticloadbalancing:ap-northeast-1:000000000000:targetgroup/sampl-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ], "Effect": "Allow" } ] }
動作確認
ELB
- 起動したEC2インスタンス、ELBのターゲットグループに登録されました。
CloudTrail
- 証跡情報として、EC2インスタンスによる
RegisterTargets
イベントを確認できました。
まとめ
EC2 AutoScallingで起動するEC2インスタンスであれば、オートスケールの設定でELBにアタッチが可能です。
EC2のローカルでDBが動作、EC2がステートフルであるためオートスケールが利用できない場合や、 開発環境などでオートスケールの発動を望まない場合、今回のAWSCLIとUserDataをお試し頂ければと思います。
今回はCloudFormation の「Resouces」を簡易なパラメータストア相当として利用しましたが、 秘匿が望ましい情報を扱う場合には、SSMのパラメータストアなどを適切に設定してご利用ください。
テンプレート
今回利用したCloudFormationテンプレートです。
sample1
- ELB、ELB、EC2が利用するセキュリティグループ、EC2用のIAMロールを作成します。
sample2
- UserDataを設定した起動テンプレートを利用し、EC2インスタンスを作成します。
- テンプレートのネストは避け、
!ImportValue
を用いて sample-1で作成したリソース情報を参照しています。